package cn.edu.cug.cs.gtl.docsrv.raw.controller;

import cn.edu.cug.cs.gtl.common.Pair;
import cn.edu.cug.cs.gtl.docsrv.dict.exception.BaseException;
import cn.edu.cug.cs.gtl.docsrv.raw.catalog.CatalogTree;
import cn.edu.cug.cs.gtl.docsrv.raw.service.RawService;
import cn.edu.cug.cs.gtl.mybatis.mapper.raw.RawAll;
import cn.edu.cug.cs.gtl.mybatis.mapper.raw.RawCatalog;
import cn.edu.cug.cs.gtl.mybatis.mapper.raw.RawFile;
import cn.edu.cug.cs.gtl.mybatis.mapper.raw.RawItem;
import cn.edu.cug.cs.gtl.mybatis.metadata.RawUtils;
import cn.edu.cug.cs.gtl.protos.Document;
import cn.edu.cug.cs.gtl.protos.Tree;
import com.google.protobuf.util.JsonFormat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.util.Base64;
import java.util.List;

@RestController
@CrossOrigin
@RequestMapping(value = "/api")
public class RawController {
    @Autowired
    RawService rawService;
    /**
     * 服务编号：7025
     * 服务名称：getCatalogTreeJSON
     * 功能描述：原始数据库中分类树的JSON
     * 接口描述：/api/raw/getCatalogTreeJSON
     * 传入参数：
     * 返回值：Tree   tree 对于的JSON
     * 调用示例：
     * http://localhost:8090/api/raw/getCatalogTreeJSON
     */
    @GetMapping(value = "/raw/getCatalogTreeJSON")
    public String getCatalogTreeJSON(){
        try {
            CatalogTree catalogTree = rawService.getCatalogTree();
            if(catalogTree!=null){
                Tree tree = catalogTree.cloneTree();
                if(tree!=null){
                    String sss = JsonFormat.printer().print(tree.toBuilder());
//                    System.out.println(sss);
                    return sss;
                }
            }
            return null;
        } catch (Exception e) {
            throw new BaseException(e.getMessage());
        }
    }

    /**
     服务编号：7007
     服务名称：getRawByInternalId
     功能描述：原始数据库中提取指定ID的原始文件
     接口描述： /api/raw/getRawByInternalId
     传入参数：
     long rawInternalId；
     返回值：
     RawAll  raw     ; RawAll的JSON字符串
     调用示例：
     */
    @GetMapping(value = "/raw/getRawByInternalId")
    public List<RawItem> getRawByInternalId(@RequestParam(value = "rawInternalId") long rawInternalId){

        try {
//            RawAll rawAll = rawService.getRawByInternalId(BigDecimal.valueOf(rawInternalId));
//            Pair<RawItem, RawFile> p = RawUtils.fromRawAll(rawAll);
            List<RawItem> rawAll = rawService.getRawByInternalId(BigDecimal.valueOf(rawInternalId));
            return rawAll;
        } catch (Exception e) {
            throw new BaseException(e.getMessage());
        }
    }

    /**
     服务编号：7001
     服务名称：addRaw
     功能描述：单个本地Raw文件入库
     接口描述： /api/raw/addRaw
     传入参数：
     返回值：
     调用示例：
     */
    @PostMapping(value = "/raw/addDocument")
    public void addDocument(
            @RequestBody byte[] data){
        try {
            Document document = Document.parseFrom(data);
            boolean b=false;
            if(document!=null){
                RawAll rawAll = RawUtils.convert(document);
                if(rawAll!=null){
                    rawService.addRaw(rawAll);
                    String dir =  document.getUrl();
//                    rawService.addRawAllByDir(dir);
                    RawCatalog rawCatalog = new RawCatalog();
                    rawCatalog.setCatalogInternalId(rawAll.getRawInternalId());
                    rawCatalog.setCatalogName(dir);
//                    rawCatalog.setCatalogOrder();
                    rawService.addRawCatalog(rawCatalog);
                }
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }

        @PostMapping(value = "/raw/updateData")
    public void updateRawData(
            @RequestParam(value = "data") String data) {
        try {
            byte [] bytes = Base64.getDecoder().decode(data);
            Document document = Document.parseFrom(bytes);
            RawAll rawAll = RawUtils.convert(document);
            rawService.updateRawData(rawAll);
        } catch (Exception e) {
            throw new BaseException(e.getMessage());
        }
    }

}
